#include "SINASTTreeVisualisationVisitor.h"
#if 0
#include <stdio.h>
#include <iostream>

#include "Common.h"
#include "SINLogger.h"
#include "SINAssert.h"
#include "SINTreeNode.h"
#include "SINConstants.h"
#include "SINLoggerManager.h"

#define SIN_ASTTreeVisualisationVisitor_LoggerName "SIN::ASTTreeVisualisationVisitor"
#define SIN_ASTTreeVisualisationVisitor_IdentationSequence "|---"

#define SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(NODENAME)				\
	void ASTTreeVisualisationVisitor::Visit(NODENAME##ASTNode & _node) {		\
		Visit(static_cast<ASTNode &>(_node));									\
	}

namespace SIN {

	ASTTreeVisualisationVisitor::ASTTreeVisualisationVisitor(OutputStream& _out):
	tabs(""), out(_out), logger_p(0x00), indentation_level(0u)
	{
		Type<LoggerManager>::ref lm(*LoggerManager::SingletonGetInstance());
		lm.GetDefaultLoggerFactory()->DestroyLogger(lm.MakeStdoutLogger(SIN_ASTTreeVisualisationVisitor_LoggerName));
		logger_p = lm.GetLogger(SIN_ASTTreeVisualisationVisitor_LoggerName);
	}

	ASTTreeVisualisationVisitor::~ASTTreeVisualisationVisitor(void) {
	}

	void ASTTreeVisualisationVisitor::Visit(ASTNode &node) {	
		out							<< 
		tabs + "+" + node.Name()	<<
		"\t\t\t(fileName:"			<<
		node.AssociatedFileName()	<<
		"\tfile line: "				<<
		node.AssociatedFileLine()	<< 
		SIN::ENDL;	
	}

	//-----------------------------------------------------------------
	
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Number	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(String	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Nil	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(True	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(False	)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Add	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Sub	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Mul	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Div	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Mod	)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Lt	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Gt	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Le	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Ge	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Eq	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Ne	)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Or	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Not)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(And)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(For		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(ForPreamble)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(ForAddendum)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(While		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(If			)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(IfElse		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Return		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Semicolon	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Break		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Continue	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Block		)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Assign	)


	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(NormalCall		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(MethodCall		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(FuncdefCall	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(ExpressionCall	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(ActualArguments)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(ExpressionList	)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Function		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(LamdaFunction	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(FormalArguments)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(ID			)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(LocalID	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(GlobalID	)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(PreIncr	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(PostIncr	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(PreDecr	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(PostDecr	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(UnaryNot	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(UnaryMin	)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(Object			)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(EmptyObject	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(UnindexedMember)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(IndexedMember	)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(ObjectMember	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(ObjectIndex	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(CallMember		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(CallIndex		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(ObjectKeys		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(ObjectSize		)

	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(MetaParse			)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(MetaPreserve		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(MetaEvaluate		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(MetaUnparse		)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(MetaParseString	)
	SINASTTREEVISUALISATION_DEFAULT_VISIT_DEFINITION(SinCode			)

	void ASTTreeVisualisationVisitor::IncreaseIndentationLevel(void) {
		tabs += SIN_ASTTreeVisualisationVisitor_IdentationSequence;
		++indentation_level;
	}
	
	void ASTTreeVisualisationVisitor::DecreaseIndentationLevel(void) {
		static const size_t tabs_len = strlen(SIN_ASTTreeVisualisationVisitor_IdentationSequence);
		SINASSERT(indentation_level > 0);
		tabs.DropLast(tabs_len);
		--indentation_level;
	}

	unsigned int ASTTreeVisualisationVisitor::IndentationLevel(void) const {
		return indentation_level;
	}


} // namespace SIN
#endif